/**
 * 图片存储迁移脚本
 * 将数据库中的图片数据迁移到文件系统存储
 */
const fs = require('fs');
const path = require('path');
const { sequelize, Submission } = require('../models');
const fileUploader = require('../utils/fileUploader');

/**
 * 执行迁移
 */
async function migrateImages() {
  let transaction = null;
  
  try {
    // 创建事务
    transaction = await sequelize.transaction();
    
    console.log('开始迁移图片数据...');
    
    // 1. 首先修改表结构，从TEXT改为VARCHAR
    console.log('修改表结构...');
    await sequelize.query(
      'ALTER TABLE submissions MODIFY COLUMN images VARCHAR(255)',
      { transaction }
    );
    
    // 2. 处理现有数据
    console.log('处理现有提交记录中的图片数据...');
    
    // 分批获取提交记录，避免一次性加载过多数据
    const batchSize = 100;
    let offset = 0;
    let hasMoreRecords = true;
    let processedCount = 0;
    let migratedCount = 0;
    
    while (hasMoreRecords) {
      // 获取一批提交记录
      const submissions = await Submission.findAll({
        where: {
          images: {
            [sequelize.Op.not]: null,
            [sequelize.Op.ne]: '[]'
          }
        },
        attributes: ['id', 'images', 'studentId'],
        limit: batchSize,
        offset: offset,
        transaction
      });
      
      if (submissions.length === 0) {
        hasMoreRecords = false;
        break;
      }
      
      // 处理每一条记录
      for (const submission of submissions) {
        try {
          let imageDataUrls = [];
          let imagePaths = [];
          
          // 解析现有的图片数据
          if (typeof submission.images === 'string') {
            try {
              imageDataUrls = JSON.parse(submission.images);
            } catch (e) {
              // 如果解析失败，跳过该记录
              console.warn(`解析提交ID ${submission.id} 的图片数据失败:`, e.message);
              continue;
            }
          }
          
          if (Array.isArray(imageDataUrls) && imageDataUrls.length > 0) {
            // 过滤出有效的data URL
            const validDataUrls = imageDataUrls.filter(url => 
              url && typeof url === 'string' && url.startsWith('data:image/')
            );
            
            if (validDataUrls.length > 0) {
              // 保存图片到文件系统
              imagePaths = await fileUploader.saveMultipleImages(
                validDataUrls,
                `migrated_${submission.id}_${Date.now()}`
              );
              
              // 更新数据库记录
              await submission.update(
                { images: JSON.stringify(imagePaths) },
                { transaction }
              );
              
              migratedCount++;
            } else {
              // 如果没有有效的data URL，清空images字段
              await submission.update(
                { images: '[]' },
                { transaction }
              );
            }
          }
          
          processedCount++;
          
          // 每处理10条记录打印一次进度
          if (processedCount % 10 === 0) {
            console.log(`已处理 ${processedCount} 条记录，成功迁移 ${migratedCount} 条`);
          }
        } catch (error) {
          console.error(`处理提交ID ${submission.id} 时出错:`, error);
          // 继续处理下一条记录，不中断整体迁移
        }
      }
      
      offset += batchSize;
    }
    
    // 提交事务
    await transaction.commit();
    
    console.log(`迁移完成！共处理 ${processedCount} 条记录，成功迁移 ${migratedCount} 条`);
    console.log('图片存储已从数据库迁移到文件系统！');
    
  } catch (error) {
    // 如果发生错误，回滚事务
    if (transaction) {
      await transaction.rollback();
    }
    
    console.error('迁移过程中发生错误:', error);
    process.exit(1);
  }
}

// 执行迁移
migrateImages();